package com.item.controller;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.init.DataSourceInitializer;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Future;

/**
 * 线程池的两种用法
 * 分页查询的两种方式
 * @author zhang-rongyao
 * @version V1.0
 * @Package com.item.model
 * @date 2021/7/27 10:22
 */
@SpringBootTest
@Slf4j
public class III {

    @Autowired
    RabbitTemplate rabbitTemplate;

    @Autowired
    @Qualifier("taskSchedulers") //指定找容器中方法名为activeExecutor的执行器
    ThreadPoolTaskScheduler taskScheduler;


    /**
     * 多线程使用的方式案例
     * 总执行时间小于每个方法执行消耗的时间
     * 使用时合理分配线程池中的核心线程数：corePoolSize
     *
     */
    @Test
    public void method3(){
        Map<String, Object> map = new HashMap<>(2);
        //开启2个任务
        int taskNum = 2;
        //线程计数器（等待所有线程执行完统一返回）
        final CountDownLatch latch = new CountDownLatch(taskNum);
        log.info("开始");
        //记录开始时间
        long startTime=System.currentTimeMillis();

        //任务一
        Future<?> future = taskScheduler.submit(() -> {
            try {
                System.out.println("正在统计用户数量");
                Thread.sleep(5000);//任务执行需要5秒
                System.out.println("统计用户数量完毕");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                //标记已经完成一个任务
                latch.countDown();
            }
        });

        try {
            latch.await();// 等待所有任务结束,唤醒main主线程
            long endTime=System.currentTimeMillis();//记录结束时间
            System.out.println("------统计指标全部完成--------");
            System.out.println("统计结果为："+map.toString());
            System.out.println("任务总执行时间为"+(endTime-startTime)/1000+"秒");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    @Autowired
    DataSource dataSource;
    @Test
    public void initDataBase() {
        log.info("============== init quartz database started ==============");
        try {
            //加载SQL
            ClassPathResource recordsSys = new ClassPathResource("sql/tables_mysql_innodb.sql");
            //使用DataSourceInitializer初始化
            DataSourceInitializer dsi = new DataSourceInitializer();
            dsi.setDataSource(dataSource);
            dsi.setDatabasePopulator(new ResourceDatabasePopulator(true, true, "utf-8", recordsSys));
            dsi.setEnabled(true);
            dsi.afterPropertiesSet();
            log.info("============== init quartz database succeed ==============");
        } catch (Exception e) {
            log.error("init quartz database failed:{}", e.getMessage());
        }
    }

}
